#pragma once

#include "log_entry.hpp"
#include "blocking_queue.hpp"

#include <thread>
#include <atomic>
#include <chrono>
#include <vector>
#include <memory>
#include <mutex>
#include <optional>

#include <concurrentqueue.h>

// --- 前置声明 ---
class ISink;
class IFormatter;

class AsyncWorker {
public:
    AsyncWorker(moodycamel::ConcurrentQueue<LogEntry>& main_queue, // 主队列引用
                BlockingQueue<LogEntry>& fallback_queue, // 备用队列引用
                std::shared_ptr<IFormatter> formatter,
                std::chrono::milliseconds flush_interval,
                float mainQueueSpaceThreshold = 0.5f,
                size_t fallbackBatchSize = 100);

    ~AsyncWorker();

    // 唤醒消费者线程（由生产者调用）
    void notify_consumer();

    // 提交日志条目到队列
    bool enqueue(LogEntry&& entry);

    // 强制刷新所有待处理的日志
    void flush();

    // 允许动态添加Sink
    void addSink(std::shared_ptr<ISink> sink);

private:
    void worker_main(); // 异步线程的主循环
    size_t drain_fallback_to_main();
    
    // 队列(生命周期由Logger管理，是一种聚合关系)
    moodycamel::ConcurrentQueue<LogEntry>& m_mainQueue; // 主队列引用
    BlockingQueue<LogEntry>& m_fallbackQueue;           // 备用队列引用

    // 回流阈值 (直接在构造函数设置，方便修改)
    float m_mainQueueSpaceThreshold;
    size_t m_fallbackBatchSize;

    std::vector<std::shared_ptr<ISink>> m_sinks; // 持有Sink的副本
    std::shared_ptr<IFormatter> m_formatter; // 持有Formatter的副本

    std::thread m_workerThread;
    std::atomic<bool> m_running; // 控制线程运行状态
    std::chrono::milliseconds m_flushInterval; // 批量刷新时间间隔

    std::mutex m_sinks_mutex; // 保护 m_sinks 列表的修改

    // --- AsyncWorker 自己的同步原语 控制休眠与唤醒 ---
    std::mutex m_worker_mutex; // 保护等待条件
    std::condition_variable m_worker_cv; // 用于唤醒

    // 暂存回流失败的值
    std::optional<LogEntry> m_pendingFallbackEntry;
};





